package com.quanyan.user.service.impl;


import com.quanyan.common.constants.Constants;
import com.quanyan.common.utils.Limit;
import com.quanyan.user.cache.MyRedisTemplate;
import com.quanyan.user.constants.UserConstants;
import com.quanyan.user.mapper.TbLevelMapper;
import com.quanyan.user.mapper.TbLevelParamMapper;
import com.quanyan.user.mapper.UserInfoMapper;
import com.quanyan.user.model.db.TbLevel;
import com.quanyan.user.model.db.TbLevelExample;
import com.quanyan.user.model.db.TbLevelParam;
import com.quanyan.user.model.db.TbLevelParamExample;
import com.quanyan.user.service.LevelService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2016/7/30.
 */
@Service
public class LevelServiceImpl implements LevelService {

    private static final Logger logger = LoggerFactory.getLogger(LevelServiceImpl.class);
    @Autowired
    private TbLevelMapper tbLevelMapper;

    @Autowired
    private MyRedisTemplate myRedisTemplate;

    @Autowired
    private UserInfoMapper userInfoMapper;


    @Autowired
    private TbLevelParamMapper tbLevelParamMapper;

    @Override
    public TbLevel getTbUserLevel(Integer userId){
        String key = UserConstants.getLevelRedisKey(userId);
        TbLevel tbLevel = (TbLevel) myRedisTemplate.get(key);
        if(tbLevel == null){
            TbLevelExample example = new TbLevelExample();
            TbLevelExample.Criteria criteria = example.createCriteria();
            criteria.andCommonIdEqualTo(userId);
            criteria.andIsDeleteEqualTo(Constants.IS_DELETE_FALSE);
            criteria.andTypeEqualTo(Constants.LevelType.USER_LEVEL);
            List<TbLevel> tbLevelList = tbLevelMapper.selectByExample(example);
            if(tbLevelList != null && tbLevelList.size() > 0){
                tbLevel = tbLevelList.get(0);
                myRedisTemplate.set(key,tbLevel,7);
                myRedisTemplate.set(UserConstants.getUserDetailRedisKey(userId),userInfoMapper.findUserInfoDetail(userId),7);
            }
        }
        return tbLevel;
    }

    public Map<Integer,TbLevel> batchTbUserLevel(List<Integer> ids){
        logger.info("批量查询用户等级信息:数量{},参数：{}",ids.size(),ids.toString());
        Map<Integer,TbLevel> map = new HashMap<>();
        List<Integer> dbIds = new ArrayList<Integer>();
        for (Integer uid : ids){
            TbLevel tbLevel = (TbLevel) myRedisTemplate.hget(UserConstants.UID_MAP_LEVEL, uid.toString());
            if (tbLevel != null)
                map.put(uid,tbLevel);
             else
                dbIds.add(uid);
        }
        logger.info("未在缓存中的数量{}，参数{}",dbIds.size(),dbIds.toString());
        if(dbIds.size() > 0){
            TbLevelExample example = new TbLevelExample();
            TbLevelExample.Criteria criteria = example.createCriteria();
            criteria.andCommonIdIn(dbIds);
            criteria.andIsDeleteEqualTo(Constants.IS_DELETE_FALSE);
            criteria.andTypeEqualTo(Constants.LevelType.USER_LEVEL);
            List<TbLevel> tbLevelList = tbLevelMapper.selectByExample(example);
            logger.info("数据库查询到的数量：{}",tbLevelList.size());
            for (TbLevel level : tbLevelList){
                map.put(level.getCommonId(),level);
                myRedisTemplate.hset(UserConstants.UID_MAP_LEVEL,level.getCommonId().toString(),level);

            }
        }
        logger.info("结束批量查询用户等级信息数量{}",map.size());
        return map;
    }

    public void updateTbLevel(TbLevel tbLevel){
        TbLevelExample tbLevelExample = new TbLevelExample();
        TbLevelExample.Criteria criteria = tbLevelExample.createCriteria();
        criteria.andCommonIdEqualTo(tbLevel.getCommonId());
        criteria.andTypeEqualTo(Constants.LevelType.USER_LEVEL);
        List<TbLevel> tbLevelList;
        try {
            tbLevelList = tbLevelMapper.selectByExample(tbLevelExample);
            if(tbLevelList != null && tbLevelList.size() > 0)
                tbLevelMapper.updateByExampleSelective(tbLevel,tbLevelExample);
            else
                tbLevelMapper.insertSelective(tbLevel);
        } catch (Exception e) {
            logger.error("更新等级积分失败！");
        }
        myRedisTemplate.set(UserConstants.getLevelRedisKey(tbLevel.getCommonId()), tbLevel, 7);
        myRedisTemplate.set(UserConstants.getUserDetailRedisKey(tbLevel.getCommonId()),userInfoMapper.findUserInfoDetail(tbLevel.getCommonId()),7);

    }

    public TbLevel getTbLevel(Integer userId){
        TbLevel tbLevel = null;
        TbLevelExample example = new TbLevelExample();
        TbLevelExample.Criteria criteria = example.createCriteria();
        criteria.andCommonIdEqualTo(userId);
        criteria.andIsDeleteEqualTo(Constants.IS_DELETE_FALSE);
        criteria.andTypeEqualTo(Constants.LevelType.USER_LEVEL);
        List<TbLevel> tbLevelList = tbLevelMapper.selectByExample(example);
        if(tbLevelList != null && tbLevelList.size() > 0){
            myRedisTemplate.hset(UserConstants.UID_MAP_LEVEL,userId.toString(),tbLevelList.get(0));
            tbLevel = tbLevelList.get(0);
        }
        return tbLevel;
    }

    public TbLevel getTbLevelDb(Integer userId){
        TbLevel tbLevel = null;
        TbLevelExample example = new TbLevelExample();
        TbLevelExample.Criteria criteria = example.createCriteria();
        criteria.andCommonIdEqualTo(userId);
        criteria.andIsDeleteEqualTo(Constants.IS_DELETE_FALSE);
        criteria.andTypeEqualTo(Constants.LevelType.USER_LEVEL);
        List<TbLevel> tbLevelList = tbLevelMapper.selectByExample(example);
        if(tbLevelList != null && tbLevelList.size() > 0){
            tbLevel = tbLevelList.get(0);
        }
        return tbLevel;
    }


    public TbLevelParam getHighLevel(){
        TbLevelParam tbLevelParam = null;
        TbLevelParamExample tbLevelParamExample = new TbLevelParamExample();
        tbLevelParamExample.setOrderByClause(" level desc");
        tbLevelParamExample.setLimit( Limit.buildLimit(0,1));
        List<TbLevelParam> listTbLevelParam = tbLevelParamMapper.selectByExample(tbLevelParamExample);
        if (listTbLevelParam != null && listTbLevelParam.size() > 0){
             tbLevelParam =  listTbLevelParam.get(0);
        }
        return tbLevelParam;
    }
}
